// Parameters
// 用于提取函数类型的参数类型
type ParametersRes = Parameters<(name: string, age: number) => {}>

// ReturnType 
// 用于提取函数类型的返回值类型。
type ReturnTypeRes = ReturnType<() => 'xie'>

// ConstructorParameters
// 用于提取构造器参数的类型
interface Constructored {
  new(name: string): number
}
type ConstructorParametersRes = ConstructorParameters<Constructored>

// InstanceType
// 可以提取构造器返回值的类型
type InstanceTypeRes = InstanceType<Constructored>

// ThisParameterType
// 提取this
type Person = {
  name: 'xie'
}
function hello(this: Person) {
  console.log(this.name)
}
type ThisParameterTypeRes = ThisParameterType<typeof hello>

// OmitThisParameter
// 删除函数this类型
type OmitThisParameterRes = OmitThisParameter<typeof hello>

// Partial
// 索引类型可以通过映射类型的语法做修改，比如把索引变为可选
type PartialRes = Partial<{name: 'xie', age: 18}>

// Required
// 去掉可选
type RequiredRes = Required<{name?: 'xie'}>

// Readonly
type ReadonlyRes = Readonly<{name: 'xie'}>

// Pick
// 保留一部分索引
type PickRes = Pick<{name: 'xie', age: 22, sex: 1}, 'name' | 'age'>

// Omit
// 删除一部分索引
type OmitRes = Omit<{name: 'xie', age: 123}, 'name'>

// Record
// 创建索引类型
// 这里很巧妙的用到了 keyof any，它的结果是 string | number | symbol：
// 但如果你开启了 keyOfStringsOnly 的编译选项，它就只是 stirng 了
type RecordRes = Record<'a' | 'b', number>

// Exclude
// 从一个联合类型中去掉一部分类型
type ExcludeRes = Exclude<'a'|'b'|'c'|'d', 'a'|'b'>

// Extract
// 从一个联合类型中保留一部分类型
type ExtractRes = Extract<'a'|'b'|'c', 'a'|'b'>

// Awaited
// 取 Promise 的 ValuType 的高级类型
type AwaitedRes = Awaited<Promise<Promise<number>>>

// NonNullable
// NonNullable 就是用于判断是否为非空类型，也就是不是 null 或者 undefined 的类型
type NonNullableRes = NonNullable<null>

// Uppercase 大写
// Lowercase 小写
// Capitalize 首写大写
// Uncapitalize 首写小写
// intrinsic 这个 intrinsic 是固有的意思，
// 就像 js 里面的有的方法打印会显示 [native code] 一样。
// 这部分类型不是在 ts 里实现的，而是编译过程中由 js 实现的。
type UppercaseRes = Uppercase<'aaa'>